/*
 * 描          述:  <描述>
 * 修  改   人:  Administrator
 * 修改时间:  2018年5月29日
 * <修改描述:>
 */
package com.tx.core.springmvc.annotation;

import org.springframework.beans.BeanUtils;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.annotation.ValueConstants;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver;

import com.alibaba.fastjson.JSONObject;

/**
 * JsonParam解析<br/>
 * <功能详细描述>
 * 
 * @author  Administrator
 * @version  [版本号, 2018年5月29日]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
public class RequestJsonParamMethodArgumentResolver
        extends AbstractNamedValueMethodArgumentResolver {
    
    /**
     * @param parameter
     * @return
     */
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return (parameter.hasParameterAnnotation(RequestJsonParam.class)
                && !BeanUtils.isSimpleProperty(parameter.getParameterType()));
    }
    
    /**
     * @param parameter
     * @return
     */
    @Override
    protected NamedValueInfo createNamedValueInfo(MethodParameter parameter) {
        RequestJsonParam ann = parameter
                .getParameterAnnotation(RequestJsonParam.class);
        return (ann != null ? new RequestJsonParamNamedValueInfo(ann)
                : new RequestJsonParamNamedValueInfo());
    }
    
    /**
     * @param name
     * @param parameter
     * @param request
     * @return
     * @throws Exception
     */
    @Override
    protected Object resolveName(String name, MethodParameter parameter,
            NativeWebRequest request) throws Exception {
        String jsonString = request.getParameter(name);
        
        //解析对象，如果jsonString为null，则结果可能为null
        Object attribute = JSONObject.parseObject(jsonString,
                parameter.getParameterType());
        
        return attribute;
    }
    
    /**
     * 获取注解值得NamedValueInfo方法<br/>
     * <功能详细描述>
     * 
     * @author  Administrator
     * @version  [版本号, 2018年5月30日]
     * @see  [相关类/方法]
     * @since  [产品/模块版本]
     */
    private static class RequestJsonParamNamedValueInfo extends NamedValueInfo {
        
        public RequestJsonParamNamedValueInfo() {
            super("", false, ValueConstants.DEFAULT_NONE);
        }
        
        public RequestJsonParamNamedValueInfo(RequestJsonParam annotation) {
            super(annotation.name(), false, ValueConstants.DEFAULT_NONE);
        }
    }
}
